package reservation;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.jdom.Element;

import serialisation.SerializableText;
import serialisation.SerializableXML;
import data.Classe;
import data.Condition;
import data.Couchette;
import data.Repas;
import data.TypePassager;

public class Billet implements Serializable, SerializableText, SerializableXML {

    /**
     * Defaut
     */
    private static final long serialVersionUID = 1L;

    /**
     * Le login de la personne qui a réservé le billet.
     */
    private Client client;

    /**
     * Le nom de la personne qui aura réservé
     */
    private String nomEtPrenom;

    /**
     * Le repas auquel le voyageur a droit.
     */
    private Repas repas;

    /**
     * Si le billet est fumeur ou pas.
     */
    private boolean fumeur;

    /**
     * Le type de passager
     */
    private TypePassager type;

    /**
     * Le trajet auxquelle le billet donne droit.
     */
    private Trajet trajet;

    /**
     * La classe à laquelle le voyageur appartient
     */
    private Classe classe;

    /**
     * Les condition d'echange, de remboursement (null si aucun).
     */
    private Condition condition;

    /**
     * Les couchettes/fauteuils (null si aucun).
     */
    private Couchette couchette;

    /**
     * Constructeur normal Creer un Trajet selon huit parametres.
     * 
     * @param t
     *            le trajet pour lequel le bilet est valide
     * @param client
     *            le client qui réserve le billet.
     * @param nom
     *            le nom du voyageur.
     * @param r
     *            le repas choisi par le voyageur
     * @param f
     *            si le billet est fumeur ou pas.
     * @param tp
     *            le type de voyageur
     * @param t
     *            le trajet pour lequel le billet est valide.
     * @param c
     *            la classe choisie par le voyageur ( premiere, seconde ...)
     * @param cd
     *            les condition d'echange/remboursement auxquelles le voyageur a
     *            droit.
     * @param co
     *            la couchette choisie par le voyageur.
     * 
     * @throws IllegalArgumentException.
     */
    public Billet(Trajet t, Client client, String nom, Repas r, boolean f,
            TypePassager tp, Classe c, Condition cd, Couchette co) {
        if (t == null || client == null || nom == null) {
            throw new IllegalArgumentException();
        }
        this.trajet = t;
        this.client = client;
        this.nomEtPrenom = nom;
        this.repas = r;
        this.fumeur = f;
        this.type = tp;
        this.classe = c;
        this.condition = cd;
        this.couchette = co;
    }

    /**
     * @return une chaine identifiant le trajet de facon unique, constitué de
     *         l'id du trajet, le login du reservateur, du nom du voyageur.
     */
    public String getID() {
        // return trajet.getIdentTrajet()+login+nom;
        return "";
    }

    /**
     * 
     * @return le prix lié a un billet en fonction des options choisies.
     */
    public int calculerPrix() {

        int prix = trajet.calculerPrix();

        if (classe != null) {
            prix += classe.calculerPrix(prix);
        }

        if (repas != null) {
            prix += repas.getPrix();
        }
        if (couchette != null) {
            prix += couchette.getPrix();
        }

        if (type != null) {
            prix = type.applyReduction(prix);
        }

        return prix;
    }

    /**
     * @return the client
     */
    public Client getClient() {
        return client;
    }

    /**
     * @return the repas
     */
    public Repas getRepas() {
        return repas;
    }

    /**
     * @return the fumeur
     */
    public boolean isFumeur() {
        return fumeur;
    }

    /**
     * @return the type
     */
    public TypePassager getType() {
        return type;
    }

    /**
     * @return the trajet
     */
    public Trajet getTrajet() {
        return trajet;
    }

    /**
     * @return the classe
     */
    public Classe getClasse() {
        return classe;
    }

    /**
     * @return the condition
     */
    public Condition getCondition() {
        return condition;
    }

    /**
     * @return the couchette
     */
    public Couchette getCouchette() {
        return couchette;
    }

    /**
     * @return the nom
     */
    public String getNom() {
        return nomEtPrenom;
    }

    /**
     * @param client
     *            the login to set
     */
    public void setClient(Client client) {
        this.client = client;
    }

    /**
     * @param repas
     *            the repas to set
     */
    public void setRepas(Repas repas) {
        this.repas = repas;
    }

    /**
     * @param fumeur
     *            the fumeur to set
     */
    public void setFumeur(boolean fumeur) {
        this.fumeur = fumeur;
    }

    /**
     * @param type
     *            the type to set
     */
    public void setType(TypePassager type) {
        this.type = type;
    }

    /**
     * @param trajet
     *            the trajet to set
     */
    public void setTrajet(Trajet trajet) {
        this.trajet = trajet;
    }

    /**
     * @param classe
     *            the classe to set
     */
    public void setClasse(Classe classe) {
        this.classe = classe;
    }

    /**
     * @param condition
     *            the condition to set
     */
    public void setCondition(Condition condition) {
        this.condition = condition;
    }

    /**
     * @param couchette
     *            the couchette to set
     */
    public void setCouchette(Couchette couchette) {
        this.couchette = couchette;
    }

    /**
     * @param nom
     *            the nom to set
     */
    public void setNom(String nom) {
        this.nomEtPrenom = nom;
    }

    /**
     * renvoie une chaine de caractere en fonction de l'objet.
     * 
     * @return la chaine de caractere qui represente l'objet.
     */
    public String toString() {
        String s = "<" + client + ":" + nomEtPrenom + ":" + trajet + ":"
                + classe + ":" + repas + ":" + type + ":" + condition + ":"
                + couchette;

        if (!fumeur) {
            s += "non ";
        }
        s += "fumeur>";

        return s;
    }
    
    /**
     * Creer le fichier de récapitulation du bilet si le client n'en possède pas encore
     * Sinon il l'ajoute au récapitulatif de ses billets
     */
    public void reservation() {

        String fichier = "<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN "+
                " 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>"+
                "<html xmlns='http://www.w3.org/1999/xhtml' dir='ltr' lang='en-US' xml:lang='en'>"+
                "<head>"+
                "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />"+
                "<meta http-equiv='X-UA-Compatible' content='IE=EmulateIE8' />"+
                "<title>Récapitulatif de votre réservation</title>"+
                "<link rel='stylesheet' href='../style.css' type='text/css' media='screen' />"+
                "<!--[if IE 6]><link rel='stylesheet' href='../style.ie6.css' type='text/css' media='screen' /><![endif]-->"+
                "<!--[if IE 7]><link rel='stylesheet' href='../style.ie7.css' type='text/css' media='screen' /><![endif]-->"+
                "<script type='text/javascript' src='../jquery.js'></script>"+
                "<script type='text/javascript' src='../script.js'></script>"+
                "</head>"+
                "<body>"+
                "<div id='art-main'>"+
                "<div class='art-header'>"+
                "<div class='art-header-png'></div>"+
                "<div class='art-header-jpeg'></div>"+
                "<div class='art-header-wrapper'>"+
                "<div class='art-header-inner'>"+
                "<div class='art-headerobject'></div>"+
                "<div class='art-logo'>"+
                "<h1 id='name-text' class='art-logo-name'><a href='#'>ACEM &amp; Co ©</a></h1>"+
                "<h2 id='slogan-text' class='art-logo-text'>Travel fast and easy !</h2>"+
                "</div>"+
                "</div>"+
                "</div>"+
                "</div>"+
                "<div class='art-sheet'>"+
                "<div class='art-sheet-tl'></div>"+
                "<div class='art-sheet-tr'></div>"+
                "<div class='art-sheet-bl'></div>"+
                "<div class='art-sheet-br'></div>"+
                "<div class='art-sheet-tc'></div>"+
                "<div class='art-sheet-bc'></div>"+
                "<div class='art-sheet-cl'></div>"+
                "<div class='art-sheet-cr'></div>"+
                "<div class='art-sheet-cc'></div>"+
                "<div class='art-sheet-body'>"+
                "<div class='art-content-layout'>"+
                "<div class='art-content-layout-row'>"+
                "<div class='art-layout-cell art-content'>"+
                "<div class='art-post'>"+
                "<div class='art-post-body'>"+
                "<div class='art-post-inner art-article'>"+
                "<h2 class='art-postheader'><img src='../images/postheadericon.png' width='22' height='21' alt='' />Récapitulatif de votre réservation</h2>"+
                "<br /><div class='art-postcontent'>"+
                "<p style='text-align: left; '><b><font color='red'> Voyageur :</font> " + this.getNom() + "</b></p>"+
                "<p style='text-align: left; '><b><font color='red'> Trajet :</font></b> </p>"+
                "<p style='text-align: left; '>- Départ de <b> "+ capitalize(this.getTrajet().getDepart().toString())+"</b>, le <b> "+this.getTrajet().getDate()+" </b> <br />-"+
                " Arrivée à <b>"+ capitalize(this.getTrajet().getArrivee().toString())+"</b>, le <b>"+this.getTrajet().calculerArrivee()+" (Durée : "+this.getTrajet().getTempsInHours()+")</b></p>"+
                "<p style='text-align: left; '> <b> "+capitalize(this.getTrajet().getTransport().getCategorie().toString())+ 
                " n°"+this.getTrajet().getTransport().getIdentTransport() +
                " de "+this.getTrajet().getTransport().getCapacite()+" places </b> </p>"+
                "<p style='text-align: left; '><b><font color='red'> Options </font></b>:</p>"+
                "<p style='text-align: left; '>- Repas : <b> "+this.getRepas().toString1()+"</b><br />- Fumeur : <b> "+(this.isFumeur() ? "Oui" : "Non")+"</b> <br />- "+
                "Tarification :<b> "+this.getType().toString1()+" </b><br />- "+
                "Classe : <b> "+this.getClasse().toString1()+"</b> <br />- "+
                "Couchette : <b> "+this.getCouchette().toString1()+"</b> <br /><br /></p>"+
                "<p style='text-align: left; '><b><font color='red'>Conditions générales :</font></b></p>"+
                "<p style='text-align: left; '>- Billet <b>  "+this.getCondition().toString1()+" </b> <br /></p>"+
                "<p style='text-align: left; '><b><font color='red'>Prix total : </font>"+ this.calculerPrix() +"€</b></p>"+
                "<p><br /></p>"+
                "</div>"+
                "<div class='cleared'></div>"+
                "</div>"+
                "<div class='cleared'></div>"+
                "</div>"+
                "</div>"+
                "<div class='cleared'></div>"+
                "</div>"+
                "</div>"+
                "</div>"+
                "<div class='cleared'></div>"+
                "<div class='art-footer'>"+
                "<div class='art-footer-t'></div>"+
                "<div class='art-footer-l'></div>"+
                "<div class='art-footer-b'></div>"+
                "<div class='art-footer-r'></div>"+
                "<div class='art-footer-body'><a href='./#' class='art-rss-tag-icon' title='RSS'></a>"+
                "<div class='art-footer-text'>   "+                        
                "<p>Copyright © 2012. All Rights Reserved.</p>"+
                "</div>"+
                "<div class='cleared'></div>"+
                "</div>"+
                "</div>"+
                "<div class='cleared'></div>"+
                "</div>"+
                "</div>"+
                "</body>"+
                "</html>";

        ecrireA(fichier,"html/reservations/"+client.getLogin()+nomEtPrenom+".html");

        File f = new File("html/reservations/"+client.getLogin()+nomEtPrenom+".html");
        try {
            java.awt.Desktop.getDesktop().browse(java.net.URI.create("file://"+f.getAbsolutePath()));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public String capitalize (String s)
    {
        char[] char_table = s.toCharArray();
        char_table[0]=Character.toUpperCase(char_table[0]);
        return new String(char_table);
    }

    public void ecrireA(String texte, String adresse) {
        try {

            FileWriter fw = new FileWriter(adresse, true);
            BufferedWriter output = new BufferedWriter(fw);
            output.write(texte + "\n");
            output.flush();
            output.close();

        } catch (IOException ioe) {
            System.out.println("erreur : " + ioe);
        }

    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Billet) {
            Billet b = (Billet) obj;
            return client.equals(b.getClient())
                    && nomEtPrenom.equals(b.getNom());
        }
        return false;
    }

    /**
     * Ajouter tous les attributs d'un objet dans une liste
     * 
     * @return la liste des attributs d'un objet
     */
    public List<String> parseText() {
        List<String> attributes = new ArrayList<String>();
        attributes.add("BILLET");
        attributes.add(String.valueOf(trajet.getIdentTrajet()));
        attributes.add(String.valueOf(client.getLogin()));
        attributes.add(String.valueOf(nomEtPrenom));
        attributes.add(repas.toString());
        attributes.add(String.valueOf(fumeur));
        attributes.add(type.toString());
        attributes.add(classe.toString());
        attributes.add(condition.toString());
        attributes.add(couchette.toString());
        return attributes;
    }

    @Override
    public Element parseXML() {
        Element billet = new Element("billet");
        // Créer l'identifiant du participant
        Element identE = new Element("identifiant");
        identE.setText(client.getLogin());
        billet.addContent(identE);
        Element nomE = new Element("nom");
        nomE.setText(nomEtPrenom);
        billet.addContent(nomE);
        Element repasE = new Element("repas");
        repasE.setText(String.valueOf(repas));
        billet.addContent(repasE);
        Element fumeurE = new Element("fumeur");
        fumeurE.setText(String.valueOf(fumeur));
        billet.addContent(fumeurE);
        Element typeE = new Element("type");
        typeE.setText(String.valueOf(type));
        billet.addContent(typeE);
        Element classeE = new Element("classe");
        classeE.setText(String.valueOf(classe));
        billet.addContent(classeE);
        Element conditionE = new Element("condition");
        conditionE.setText(String.valueOf(condition));
        billet.addContent(conditionE);
        Element couchetteE = new Element("couchette");
        couchetteE.setText(String.valueOf(couchette));
        billet.addContent(couchetteE);
        return billet;
    }
}